package phaseListener;

import java.io.IOException;

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.ListenerFor;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;


public class AutorizaListener implements PhaseListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	
	public void afterPhase(PhaseEvent event) {
		//imprime o identificador da fase
		System.out.println(event.getPhaseId());
		FacesContext ctx = event.getFacesContext();
		// captura a URL destino
		String paginaAtual = ctx.getViewRoot().getViewId();
		// imprime a URL destino
		System.out.println("Pagina destino"+paginaAtual);
		
//		boolean isLoginPage = paginaAtual.lastIndexOf("login.jsp") > -1;
		
//		Object usuarioLogado = ((HttpSession) ctx.getExternalContext().getSession(true)).getAttribute("usuarioLogado");
//		System.out.println(usuarioLogado.toString());
//		
//		if (!isLoginPage && usuario == null) {
//            // Redireciona o fluxo para a página de login
//            NavigationHandler nh = contexto.getApplication().getNavigationHandler();
//            nh.handleNavigation(contexto, null, "sair");
//        } else if (isLoginPage && usuario != null) {
//            // Se o usuário logado tentar acessar a página de login ele é
//            // redirecionado para a página inicial
//            NavigationHandler nh = contexto.getApplication().getNavigationHandler();
//            nh.handleNavigation(contexto, null, "sucesso");
//        }
		
	}

	
	public void beforePhase(PhaseEvent event) {
		System.out.println(event.getPhaseId());
//		FacesContext ctx = event.getFacesContext();
//		String paginaDestino = ctx.getViewRoot().getViewId();
//		System.out.println(paginaDestino);
//
//		if (event.getPhaseId().equals(PhaseId.RESTORE_VIEW)) {
//			// AQUI DEVE FICAR A LÓGICA PARA VERIFICAR SE EXISTE UM USUÁRIO
//			// AUTENTICADO NA APLICAÇÃO
//			FacesContext ctx = event.getFacesContext();
//			// verifica se existe um usuário autenticado
//			if (ctx.getExternalContext().getSession(true)
//					.getAttribute("usuarioLogado") == null) {
//				// se não existir direciona para a página de LOGIN
//				ctx.getExternalContext().redirect("/jsp/paginaLogin.xhtml");
//			}
//		}

	}

	
	public PhaseId getPhaseId() {
		return PhaseId.ANY_PHASE;
		//return null;
	}

//	// REPRESENTA A LISTA DE PÁGINA QUE O USUÁRIO PODE ACESSAR
//	private String[] paginasAutorizadas = new String[] { "/jsp/login.xhtml",
//			"/jsp/dashBoard.xhtml", "/jsp/consultarCliente.xhtml" };
//
//	// RESPONSÁVEL POR VERIFICAR SE O USUÁRIO ESTA AUTORIZADO
//	public boolean verificarAutorizacao(String paginaRequisitada) {
//		for (String pagina : paginasAutorizadas) {
//			if (paginaRequisitada.equals(pagina)) {
//				return true;
//			}
//		}
//		return false;
//	}
//
//	/**
//	 * Método chamado sempre apósa execução de uma determinada PHASE
//	 * 
//	 * @param event
//	 *            - {@link PhaseEvent}
//	 */
//	public void afterPhase(PhaseEvent event) {
//		System.out.println(event.getPhaseId());
//		FacesContext ctx = event.getFacesContext();
//		String paginaDestino = ctx.getViewRoot().getViewId();
//		System.out.println(paginaDestino);
//
//		// CONFORME DITO ANTERIORMENTE MESMO SEM O USO DE NA FASE
//		// APPLY_REQUEST_VALUES O NOME DA PÁGINA ESTARA ATUALIZADO, PORTANTO E
//		// NESSA FASE QUE PODEMOS VERIFICAR SE O USUÁRIO ESTA AUTORIZADO A
//		// ACESSAR
//		// A PÁGINA REQUISITADA
//		if (event.getPhaseId().equals(PhaseId.APPLY_REQUEST_VALUES)) {
//			FacesContext ctx = event.getFacesContext();
//			// CAPTURA O USUÁRIO LOGADO POIS SE ESTA FASE FOR EXECUTADA
//			// SIGNIFICA QUE EXISTE USUÁRIO AUTENTICADO
//			Object usuarioLogado = ctx.getExternalContext().getSession(true)
//					.getAttribute("usuarioLogado");
//			String urlDestino = ctx.getViewRoot().getViewId();
//			// VALIDA A AUTORIZAÇÃO PARA ACESSAR A PÁGINA
//			if (!verificarAutorizacao(urlDestino)) {
//				// seo usuario não possuir acesso dereciona para uma página de
//				// erro
//				ctx.getExternalContext().redirect(
//						"/jsp/paginaDeErroDeAutorizacao.xhtml");
//			}
//		}
//	}
//
//	/**
//	 ** Método chamado sempre antes de se executar uma determinada PHASE
//	 * 
//	 * @param event
//	 *            - {@link PhaseEvent}
//	 */
//	public void beforePhase(PhaseEvent event) {
//		System.out.println(event.getPhaseId());
//		FacesContext ctx = event.getFacesContext();
//		String paginaDestino = ctx.getViewRoot().getViewId();
//		System.out.println(paginaDestino);
//
//		if (event.getPhaseId().equals(PhaseId.RESTORE_VIEW)) {
//			// AQUI DEVE FICAR A LÓGICA PARA VERIFICAR SE EXISTE UM USUÁRIO
//			// AUTENTICADO NA APLICAÇÃO
//			FacesContext ctx = event.getFacesContext();
//			// verifica se existe um usuário autenticado
//			if (ctx.getExternalContext().getSession(true)
//					.getAttribute("usuarioLogado") == null) {
//				// se não existir direciona para a página de LOGIN
//				ctx.getExternalContext().redirect("/jsp/paginaLogin.xhtml");
//			}
//		}
//	}
//
//	/**
//	 * Retorna o PhaseId da fase do ciclo de vida JSF que esta sendo
//	 * interceptado e gerênciado pelo Controle de acesso.
//	 * 
//	 * @return - {@link PhaseId}
//	 */
//	public PhaseId getPhaseId() {
//		return PhaseId.ANY_PHASE;
//	}
}
